<?php
class BaseController {
	//Имя view, которое должно быть загружено, и данные которые ему должны быть переданы 
	protected $view_name, $view_data = array();
	
	//Параметры переданные контроллеру
    protected $params;

    //Имя js-файла, для конкретной страницы
    protected $js_name = FALSE;
    
    //Набор дополнительный js-файлов, которые должны быть подключены
    //Для действий, которые повторяются на нескольких страницах
    protected $js_names = array();
	
	//Аналогично для css
	protected $css_name = FALSE;
    protected $css_names = array();
        
    function __construct($params = NULL) {
        $this->params = $params;
		$this->css_names = Config::get('css_files');
		$this->view_data['template'] = array();
    }   
	
    //Работа с параметрами
    public function params($params) {
        $result = array();
        $i = 0;
        foreach ($params as $key=>$value) {
            $param = $this->params[$i++];            
            
            if ($value == 'num' && !is_numeric($param)) return;
            
            $result[$key] = $param;
        }

        return $result;
    }
	
	//Включение js на странице
	function jsON() {
        $this->js_name = TRUE;
    }
	
	function addJS($js) {
		$this->js_names[] = $js;
	}
	
	//Отключение view
	function viewOFF() {
		$this->view_name = FALSE;
	}
	
	function addViewData($name, $data) {
		$this->view_data[$name] = $data;
	}
	
	function addTemplateData($name, $data) {
		$this->view_data['template'][$name] = $data;
	}
	
    //Передаём данные какому-либо блоку
    function addBlockData($block_name, $data, $add_data = NULL) {
        if (!is_null($add_data))
		    $this->view_data['_blocks'][$block_name][$data] = $add_data;
		else            
            $this->view_data['_blocks'][$block_name] = $data;
    }
	
    function __destruct() {    	
    	//Если view не нужно выводить, то можно завершать работу
    	if (!$this->view_name) return;
		
        //По умолчанию структура js- и css-файлов повторяет структуру контроллеров и их методов
        if ($this->js_name) {                
            if ($this->js_name === TRUE)
                $this->js_name = Path::default_path();
            $this->js_names[] = $this->js_name;
        }
        
		$this->view_data['head']['js_files'] = array();
        //Передаём список необходимых js файлов во view
        foreach ($this->js_names as $js_name) {
            $this->view_data['head']['js_files'][] = $js_name;
        }
    
        //Js-библиотеки
		$this->view_data['head']['framework_js_files'] = Config::get('framework_js_files');

        //Аналогично для css
        if ($this->css_name) {                
            if ($this->css_name === TRUE)
                $this->css_name = Path::default_path();
            $this->css_names[] = $this->css_name;
        }
        
        $this->view_data['head']['css_files'] = array();
        //Передаём список необходимых js файлов во view
        foreach ($this->css_names as $css_name) {
            $this->view_data['head']['css_files'][] = $css_name;
        }   

        //Css-библиотеки
        $this->view_data['head']['framework_css_files'] = Config::get('framework_css_files');				     
				     
        //Передаём во view данные о странице
        $view = new View($this->view_name, $this->view_data);
        
        //Выводим содержимое
        echo $this->getContent($view);       
    }
    
    private function getContent($view) {
        //ob_start('ob_gzhandler'); //Почему-то не работает
		extract($this->view_data['template']);
        ob_start();
        require_once(Path::view('template'));
        $content = ob_get_contents();
        ob_end_clean();
        return $content;
    }
}
?>